#include "str_util.h"

// 假设max_tokens是数组tokens的最大大小
// 在使用后，记得要释放空间
void splitString(const char * pstrs, const char* delimiter, char *tokens[], int max_tokens, int * pcount) {
    int token_count = 0;
    char *token = strtok((char *)pstrs, delimiter); // 使用delimiter作为分隔符

    while (token != NULL && token_count < max_tokens - 1) { // 保留一个位置给NULL终止符
        char * pstr = (char*)calloc(1, strlen(token) + 1);
        strcpy(pstr, token);
        tokens[token_count] = pstr;//保存申请的堆空间首地址
        token_count++;
        token = strtok(NULL, delimiter); // 继续获取下一个token
    }
    // 添加NULL终止符
    tokens[token_count] = NULL;
    *pcount= token_count;
}

void freeStrs(char * pstrs[], int count)
{
    for(int i = 0; i < count; ++i) {
        free(pstrs[i]);
    }
}

/*生成hash值*/
int hash_sha256(char* filename, char* result){

    int fd = open(filename, O_RDONLY);
    ERROR_CHECK(fd, -1, "open");
    char buff[1000] = {0};
    int ret = 0;

    //使用EVP接口
    EVP_MD_CTX* context = EVP_MD_CTX_new();
    ERROR_CHECK(context, NULL, "EVP_MD_CTX_new");

    //初始化sha_256
    EVP_DigestInit_ex(context, EVP_sha256(), NULL);

    while(1){
        bzero(&buff, sizeof(buff));
        ret = read(fd, buff, sizeof(buff));
        if(ret == 0){
            break;
        }
        //每段内容都需要调用更新函数
        EVP_DigestUpdate(context, buff, ret);
    }

    unsigned length = 0;
    unsigned char sh[SHA256_DIGEST_LENGTH] = {0};
    EVP_DigestFinal_ex(context, sh, &length);

    for(unsigned int i = 0; i < length; i++){
        char frag[3] = {0};
        sprintf(frag, "%02x", sh[i]);
        strcat(result, frag);
    }

    //释放资源
    EVP_MD_CTX_free(context);

    return 0;

}
